管理多种内存可以通过两种方式来实现:显式地通过程序实现，或隐式地通过运行时实现。每种方法都有其优点和缺点，可以根据情况或个人喜好进行选择。\par

\hspace*{\fill} \par %插入空行
\textbf{显式数据移动}

显式地在不同内存之间复制数据。图3-2展示了一个有独立加速器的系统，必须先将内核需要的任何数据从主机内存复制到GPU内存。在内核计算结果之后，将这些结果复制回CPU，然后主机才能使用这些数据。\par

显式数据移动的优点是，可以完全控制数据在不同内存之间的传输时间。因为要在某些硬件上获得最佳性能，将计算与数据传输重叠必不可少。\par

显式数据移动的缺点是，指定所有数据移动会很繁琐，而且容易出错。传输不正确的数据量，或者没有确保在内核开始计算之前已经传输了所有数据，都可能导致不正确的结果。从一开始就正确地移动所有数据是非常耗时的任务。\par

\hspace*{\fill} \par %插入空行
\textbf{隐式数据移动}

程序控制的显式数据移动的替代方案，由运行时或驱动程序控制的隐式数据移动。这种情况下，运行时不需要进行显式复制，而是负责确保数据在使用之前就传输到适当的位置。\par

隐式数据移动的优点是，应用程序直接连接到设备内存，这样会更快，所有工作都由运行时完成。这也减少了引入错误的机会，因为运行时将自动识别何时执行数据传输，以及传输多少数据。\par

隐式数据移动的缺点是，对运行时的隐式行为控制较少或没有控制。运行时将提供功能的正确性，但可能不会以最佳的方式移动数据，以确保计算与数据传输重叠，这可能会对程序性能产生负面影响。\par

\hspace*{\fill} \par %插入空行
\textbf{选择正确的策略}

选择最佳策略取决于许多的因素，不同的策略可能适合程序开发的不同阶段。我们甚至可以决定，最好的解决方案可以为程序的不同部分混合和适配显式和隐式方法。可以选择使用隐式数据移动，来简化移植到新设备的过程。当开始调优程序性能时，可能会用代码中对性能至关重要的显式部分替换隐式数据移动。未来的章节将涵盖数据传输如何与计算重叠，从而达到优化性能的目的。\par















